# -*- coding: utf-8 -*-

#Descrição: Classe principal da aplicação em CPython
#Funcionalidades:
#   ler o código HTML de um site e contar os tokens;
#   converte dados em csv para uma BD SQLite3;
#   faz estatisticas com os dados e apresenta-os em HTML e em gráficos;
#Data: 21/11/11
#Autor: Luís Costa Nº 6032
#-----------------------------------------------
from Connection import Connection
from ProcessHTML import ProcessHTML
from ProcessCSV import ProcessCSV
from Database import DataBase
from Statistics import Statistics
from HTTPServer import HTTPServer

class Main:
    
    #Construtor da classe.
    def __init__(self):
        
        #Constantes
        #---------------------
        self.CONST_REBIDES_FILE_NAME = 'reb'
        #--------------------

        #Objetos das classes
        #--------------------
        self.connection = Connection()
        self.processHTML = ProcessHTML()
        self.processCSV = ProcessCSV()
        self.db = DataBase()
        self.stat = Statistics()
    pass
    
    #Inicia o processo de calculo da estatistica dos tokens HTML
    #-----------------------------------
    def count_html_tokens(self, URL):

        file = self.get_html(URL)
        self.process_html(file)
    pass
   
    #Método permite efetuar a estatistica dos tokens html.
    #Passa o html e recebe a contagem dos tokens.
    #-----------------------------------
    def process_html(self, url):

        #Passa o endereço de um site e recebe o código html.
        file = self.connection.open_connection(url)
        
        #Transforma os dados passados pelo urllib2 num ficheiro de dados
        #----------------------------
        data = self.processHTML.read_data(file)

        #Faz as contagens dos tokens
        #------------------------
        self.processHTML.calculate_tokens(data)
    pass
    
    #Cria um ficheiro CSV com os o resultado da contagem dos tokens HTML
    #------------------------
    def csv_html_tokens(self):
        self.processHTML.csv_html_tokens()
    pass
    #------------------------

    #Cria um gráfico com os resultados da contagem dos tokens HTML
    #------------------------
    def graph_html_tokens(self):
        self.processHTML.graph_html_tokens()
    pass
    #------------------------
    
    #Inicia o servidor de HTTP
    #-----------------------
    def start_http_server(self):
        self.httpServer = HTTPServer()
        self.httpServer.start(8000)
    pass

    #Para o servidor de HTTP
    #-----------------------
    def stop_http_server(self):
        self.httpServer.stop()
    pass
    #Método para criar as tabelas na BD
    #-----------------------------------
    def create_db_tables(self, file):
        
        self.db.create_tables()
    pass
    
    #Permite is buscar os dados de todos os anos aos ficheiros CSV
    #-------------------------
    def get_rebides_data_all(self):
        
        for ano in range(10):
            get_rebides_data(ano)
        pass
    pass
    #Permite ir buscar os dados de um ano para o rebides ao ficheiro CSV
    #----------------------
    def get_rebides_data(self, ano):
        
        print 'A iniciar o processamento dos dados do CSV do ano ' + str(ano)
        print '---------------'
        
        #Cria o nome do ficheiro CSV segundo o ano
        #-----------------
        fileName = self.CONST_REBIDES_FILE_NAME + str(ano) + '.csv'
        print 'Nome do ficheiro: ' + fileName
        
        #Chama o método para ir buscar os dados ao CSV
        #--------------------
        dictData = self.processCSV.process_rebides_csv(fileName)
        
        print 'Dados do CSV do ano ' + str(ano) +' processados com sucesso!'
        print '---------------'

        #Envia os dados do CSV para serem processados e enviados para a BD
        #--------------------
        msg = 'A iniciar o processamento dos dados do ano ' + str(ano)
        msg = msg + ' para a bd'

        print msg
        print '---------------'
        
        self.db.process_data(dictData, ano)
        
        print 'Processamento dos dados do ano ' + str(ano) + ' terminado!\n'
    pass
    
    #*************CORRIGIR: É por estab. e depois por ano*****************
    #*********************************************************************    
    
    #Gera as estatisticas do número professores por estabelecimento e por ano
    #---------------------------------------
    def get_stat_teachers_per_establishment(self):
        
        print 'A iniciar o calculo da estatistica: número professores por '\
                'estabelecimento e por ano....\n'
        
        self.stat.stat_teachers_per_establishment(self.db)
        
        print 'Estatistica processada com sucesso!\n' 
    pass
            
    #Gera as estatisticas do número professores por categoria, 
    #por estabelecimento e por ano.
    #---------------------------------------
    def get_stat_teachers_per_category_establishment_year(self):
        
        print 'A iniciar o calculo da estatistica: número professores por '\
                'categoria, por estabelecimento e por ano....\n'
        
        self.stat.stat_teachers_per_category_establishment_year(self.db)
        
        print 'Estatistica processada com sucesso!\n' 
    pass
    
    #Gera as estatisticas do número professores por tipo de grau, 
    #por estabelecimento e por ano.
    #---------------------------------------
    def get_stat_teachers_per_type_degree_establishment_year(self):
        
        print 'A iniciar o calculo da estatistica: número professores por '\
                'tipo de grau, por estabelecimento e por ano....\n'
        
        self.stat.stat_teachers_per_type_degree_establishment_year(self.db)
        
        print 'Estatistica processada com sucesso!\n' 
    pass
    
    #Cria um CSV com os dados dos professores por estabelecimento
    #---------------------------------------
    def csv_teachers_per_establishment(self):

        self.stat.csv_teachers_per_establishment()
    pass
    #---------------------------------------
    
    #Cria uma listagem HTML os dados dos professores por estabelecimento
    #---------------------------------------
    def list_teachers_per_establishment(self):
        
        self.stat.list_teachers_per_establishment()
    pass
    #---------------------------------------
    
    #Cria uma gráfico com os dados dos professores por estabelecimento
    #---------------------------------------
    def graph_teachers_per_establishment(self):
        
        self.stat.graph_teachers_per_establishment()
    pass
    #---------------------------------------
    
    #Cria um CSV com os dados dos professores por categoria
    #---------------------------------------
    def csv_teachers_per_category(self):

        self.stat.csv_teachers_per_category()
    pass
    #---------------------------------------
    
    #Cria uma listagem HTML os dados dos professores por categoria
    #---------------------------------------
    def list_teachers_per_category(self):
        
        self.stat.list_teachers_per_category()
    pass
    #---------------------------------------
    
    #Cria uma gráfico com os dados dos professores por categoria
    #---------------------------------------
    def graph_teachers_per_category(self):
        
        self.stat.graph_teachers_per_category()
    pass
    #---------------------------------------
    
    #Cria um CSV com os dados dos professores por tipo de grau
    #---------------------------------------
    def csv_teachers_per_tdegree(self):

        self.stat.csv_teachers_per_tdegree()
    pass
    #---------------------------------------
    
    #Cria uma listagem HTML os dados dos professores por tipo de grau
    #---------------------------------------
    def list_teachers_per_tdegree(self):
        
        self.stat.list_teachers_per_tdegree()
    pass
    #---------------------------------------
    
    #Cria uma gráfico com os dados dos professores por tipo de grau
    #---------------------------------------
    def graph_teachers_per_tdegree(self):
        
        self.stat.graph_teachers_per_tdegree()
    pass
    #---------------------------------------
